//一，导入包
//1. 导入express包
var express = require('express')
//2. 导入数据库操作的方法
const { getAll, getById, exec } = require('../db/index')
//3.导入配置文件的错误处理
const { debug } = require('../config')

//二，创建Router对象
var router = express.Router()

//三，操作路由
/* （一）获取所有list
GET/lists
注意：由于在app.js的注册中间件中，定义了路由统一前缀,所以这里不与要写(/lists)
 */
router.get('/', async (req, res) => {
  //1.解析请求参数
  //2.操作数据库
  //1) 编写SQL语句,注意mysql判断是否为空,要用is或者is not判断
  let sql ='select id, content, updated_time from xzd_todos where deleted_time is null'
  //2) 执行SQL语句(try...catch响应错误)
  try{
    // 需要测试的代码
    const data = await getAll(sql)
    res.send({
      code:0,
      message:'获取所有代办成功',
      result:data,
    })
  }catch(err){
    // 判断-报错:处理异常情况(错误处理)
    res.send({
      code:100101,
      mesage:'获取所有待办失败',// 10: 第一个版; 01: todos模块; 01: 错误
      result: debug?err:'',//module.exports={debug:true}
    })
  }
})

/* （二）根据id获取list
GET/lists/:id
 */
router.get('/:id', async (req, res) => {
  //1.解析请求参数
  const {id} = req.params
  // 判断-报错:对请求的参数格式进行校验
  const reg=/^\d+$/
  if(!reg.test(id)){
    res.send({
      code:100104,
      message:'id必须为数字',
      result:'',
    })
    return
  }
  //2.操作数据库
  //1) 编写SQL语句,注意:不要忘记deleted_time is null
  let sql = `select id, content, updated_time from xzd_todos where id=${id} and deleted_time is null`
  //2) 执行SQL语句
  try{
    var data = await getById(sql)
  }catch(err){
    //判断-报错:查询单个待办失败,aql语句错误
    res.send({
      code:100102,
      message:'查询单个待办失败,aql语句错误',
      result:debug? err:''
    })
  }
  //判断-报错:根据id没有查询到结果
  if(data){
    res.send({
      code:0,
      message:'查询单个数据成功',
      result:data,
    })
  }else{
    res.send({
      code:100104,
      message:'id对应的数据不存在',
      result:'',
    })
  }
})

/* （三）添加list
POST/lists
 */
router.post('/', async (req, res) => {
  //1.解析请求参数
  const { content } = req.body
  //判断-报错:content格式错误
  if(!content){
    res.send({
      code:100105,
      message:'content格式错误',
      result:''
    })
    return
  }

  //2.操作数据库
  //1) 编写SQL语句添加text，生成created_time
  let sql = `INSERT INTO xzd_todos (content,created_time) VALUES ('${content}',NOW())`
  //2) 执行SQL语句
  //const data1 = await exec(sql)
  //console.log(data1);
  try{
    var {insertId} = await exec(sql)
    res.send({
      code:0,
      message:'添加代办成功',
      result:{
        id:insertId,
        content
      }
    })
  }catch(err){
    //判断-报错:查询单个待办失败,aql语句错误
    res.send({
      code:100106,
      message:'添加待办失败,sql语句错误',
      result:debug? err:'',
    })
    return 
  }
})
  
  /* //3) 编写SQL语句,获取id为新添加的数据，从而得到新添加的list的时间
  sql = `select id, content, updated_time from xzd_todos where id=${insertId}`
  //4) 执行SQL语句
  try{
    const data = await getById(sql)
    res.send({
      code:0,
      message:'添加代办成功',
      result:data
    })
  }catch(err){
    res.send({
      code:100106,
      message:'添加待办失败',
      result:debug? err:''
    })
  } 
}) */

/* （四）修改list
PUT/lists/:id
 */
router.put('/:id', async (req, res) => {
  //1.解析请求参数
  const id = req.params.id
  // 判断-报错:对请求的参数格式进行校验
  const reg=/^\d+$/
  if(!reg.test(id)){
    res.send({
      code:100104,
      message:'id必须为数字',
      result:'',
    })
    return
  }
  const { content } = req.body
  console.log(content)
  if(!content){
    res.send({
      code:100105,
      message:'content格式错误',
      result:''
    })
    return
  }

  //2.操作数据库
  //1) 编写SQL语句,修改内容，注意再修改的同时，created_time会自动更新
  let sql = `UPDATE xzd_todos SET content='${content}' WHERE id=${id}`
  //2) 执行SQL语句
  try{
    await exec(sql)
    res.send({
      code:0,
      message:'修改代办成功',
      result:{
        id,
        content
      }
    })
    //console.log(data1)
  }catch(err){
    res.send({
      code:100107,
      message:'修改待办失败',
      result:debug ? err :''
    })
  }
})

  //不用重新获取也可以,因为之后在前端,发送请求时,会重新获取数据库数据
  /* //3) 编写SQL语句，重新获取修改后的内容和时间
  sql = `select id,content,updated_time from xzd_todos where id=${id}`
  //4) 执行SQL语句
  try{
    const data = await getById(sql)
    res.send({
      code:0,
      message:'修改代办成功',
      result:data
    })
  }catch(err){
    res.send({
      code:100107,
      message:'修改代办失败',
      result:debug?err:''
    })
  }
}) */

/* （五）删除list
DELETE/lists/:id
 */
router.delete('/:id', async (req, res) => {
  //1.解析请求参数
  const {id} = req.params
  // 判断-报错:对请求的参数格式进行校验
  const reg=/^\d+$/
  if(!reg.test(id)){
    res.send({
      code:100104,
      message:'id必须为数字',
      result:'',
    })
    return
  }
  //2.操作数据库
  //1) 编写SQL语句
  let sql = `UPDATE xzd_todos SET deleted_time=now() WHERE id=${id}`
  //2) 执行SQL语句
  try{
    await exec(sql)
    res.send({
      code:0,
      message:'删除待办成功',
      result:''
    })
  }catch(err){
      res.send({
        code:100108,
        message:'删除代办失败',
        result:debug?err:''
      })
    } 
})

//四，导出路由对象
module.exports = router
